Jan 23 2018 / 21:46:35
プログラミング > webアプリ開発 > YoutubeTools >
Keyword:

Youtubeの動画ダウンローダを作る(その2)

今日の目標

昨日の続き。昨日「問題なさげ。」とか書いてたけどお前はどんなテストしたんだよ!って話です。


PHP Warning: file_get_contents(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0
こぉんなすごくおもしろいえらーがでました。

原因はエラー文にも書いてあるとおりxdomainのサーバーで「allow_url_fopen」の項目がセキュリティ上の観点から0(無効)にされていたからでした。(#1)

ということで今夜はこのエラーを修正するため奮闘するわけです。

#1 無料Webレンタルサーバーではよくあること

GP君、Herokuを使う

何を思ったのかGP君、まずherokuにアプリケーションサーバーを建てようという考えに至りました。ということでphpでしていた処理をnode.jsに書き換えてappサーバーを立てて「そこにアクセスする」ようにしましたが結局「そこにアクセスする」という処理(get_file_contents)がエラってるので直るはずもなく...

node.jsでのコーディング

ちょっと脇道にそれてappサーバーのプログラムであるnode.jsのプログラムも何気に人生初で書いたのでどんなものを使ったか紹介しておこうと思います。

やりたかった処理は クエリ文字列を解析 ー> 外部サーバーにアクセス ー> 帰ってきたデータ整理してを呼び出し元に返すという処理です。

まずクエリ文字列の解析はURLモジュールを使ってやりました。こんな感じ

const url = require('url'); let server = http.createServer(); server.on('request', (req, res) => { // req.url ーー アクセス元URL url.parse(req.url, true).query // これでいける });

外部サーバーへのアクセスは「リクエスト処理の中でコールバック関数を使う」という行為に少し躓きましたがrequestという便利なモジュールをnpmでインスコして書きました。

クエリ文字列がなかった場合やアクセスに失敗した場合もしっかりレスポンスは返さないといけないらしいので(#2)から文字列を返すように書きました。

#2 https://stackoverflow.com/questions/20355136/must-res-end-be-called-in-express-with-node-js

GP君、cURLが救いになりそうだという情報を仕入れる

前章が成功しなかったのでかなりやる気も落ちていたのですが、根気強く調べた結果cURLを使えばいけそうだという情報を耳にしました。ローカル環境の方にcURLがなかったのでインストールして{Debian(ubuntu)}


sudo apt-get install php-curl

こんな感じでcURLを使いました。

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, さっき作ったappサーバーへのURL); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $url = curl_exec($ch); curl_close($ch);
それで動いたのだからこんなツイートもしてしまうわけです。

まとめ

cURLが神だということがわかったので簡単にcURLが使えるような関数でも使って僕もレンタルサーバーでバリバリ外部サイトアクセスできるようにしようネ。